package algo3c3g3.controller;

import algo3c3g3.model.action.*;
import algo3c3g3.model.*;

/**
 * Clase encargada de controlar las acciones de las unidades en juego.
 */
public class ActionController
{
    private Level level;
    private Class currentAction;
    private ActionsAvailable actions;
    
    /**
     * @param level Modelo de datos sobre el que este controlador actua.
     */
    public ActionController(Level level)
    {
        this.level = level;
        actions = level.getActionsAvailable();
    }
    
    /**
     * Cambia la accion de la unidad en la posicion x, y a la accion
     * seleccionada actualmente. La accion seleccionada cambia a null
     * despues de asignar la accion a la unidad.
     * @return true si la accion pudo ser asignada a la unidad.
     */
    public boolean setUnitAction(int x, int y)
    {
        if(currentAction == null) return false;
        
        Unit u = selectUnit(x, y);
        
        if(u == null) return false;
        
        if(actions.fetchAction(currentAction) == 0)
            return false;
        
        try
        {
            u.setAction((Action)currentAction.newInstance());
            currentAction = null;
            return true;
        }
        catch(Exception e)
        {
            System.out.println("Error al crear accion");
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * Cambia la accion de la unidad en la posicion indicada, a la accion
     * seleccionada actualmente.
     * @return true si la accion pudo ser asignada a la unidad.
     */
    public boolean setUnitAction(Coord position)
    {
        return setUnitAction(position.getXCoord(), position.getYCoord());
    }
    
    private Unit selectUnit(int x, int y)
    {
        return level.getWorld().getUnit(x, y);
    }
    
    /**
     * Establece la accion seleccionada. La accion seleccionada es asignada a una unidad
     * al llamar a setUnitAction().
     * @param action Accion seleccionada
     */
    public Class selectAction(Class action)
    {
        return currentAction = action;
    }
    
    /**
     * Devuelve la accion seleccionada.
     */
    public Class getCurrentAction()
    {
        return currentAction;
    }
}
